package com.xf.algorithm.jdk.sec;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

/**
 * 1、使用 CBC 有向量模式时，cipher.init 必须传入 {@link AlgorithmParameterSpec}-算法参数规范。如果使用的是 ECB-无向量模式，那么 cipher.init 则加解密都不需要传
 * {@link AlgorithmParameterSpec} 参数.
 *
 * 2、生成密钥 SecretKey 与 算法参数规范 AlgorithmParameterSpec 的 key ，AES加密算法时必须是 16 个字节，DES 时必须是 8 字节.
 *
 * 3、加/解密都是调用 Cipher.doFinal(byte[] content) 方法，具体取决于 cipher.init 时 使用的是 Cipher.ENCRYPT_MODE 加密模式，还是 Cipher.DECRYPT_MODE 解密模式.
 *
 * 4、下面演示的是 AES 加密算法，DES 加密算法使用也是同理，区别在于参数：secret_key、vector_key : AES 时必须是 16 个字节，DES 时必须是 8 字节.
 *
 * 无限制策略文件：https://www.oracle.com/java/technologies/javase-jce-all-downloads.html
 */
public class EncryptionExample {
    public static void main(String[] args) throws Exception {
        String plaintext = "Hello World!"; // 明文
        String key = "1234567890123456"; // 密钥
        /*
        *
        * */
        String algorithm = "AES/ECB/PKCS5Padding";

        // 初始化Cipher对象
        Cipher cipher = Cipher.getInstance(algorithm);
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);

        // 加密数据
        byte[] encrypted = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
        String encryptedString = Base64.getEncoder().encodeToString(encrypted);
        System.out.println("Encrypted String: " + encryptedString);
    }
}
